import { AudioRecorderApi } from "@/components/audio/AudioRecorderApi";
import $CtAudioRecorder from "@/components/CtAudioRecorder/ctAudioRecorder.js";
import $CtDialogVideo from "@/components/ctDialogVideo/ctDialogVideo.js";
import $CtLinkVideo from "@/components/CtLinkVideo/CtLinkVideo.js";
import $CtLookHere from "@/components/CtLookHere/CtLookHere.js";
import $FileViewer from "@/components/FileViewer/index.js";
import { isEmptyObject } from "@/utils/common";
import cryptoUtil from "@/utils/cryptoUtil";
import { iframeEncrypt } from "@/utils/jsencrypt";
let lockId = null;
export function addUrl(data, _vue = this) {
  console.log("dataData", data);
  data.viewId = _vue.curViewId; // 记录当前页面id
  return new Promise((resolve, reject) => {
    try {
      _vue.$store.dispatch("bulletFrameUrlModel/addUrl", data).then((resp) => {
        console.log("增加完了", _vue.$store.state.bulletFrameUrlModel.url);
        resolve(data);
      });
    } catch (e) {
      console.log("增加出现异常", e);
      reject();
    }
  });
}

export function delUrl(data, _vue = this) {
  console.log("dataData2", data);
  data.viewId = _vue.curViewId; // 记录当前页面id
  return new Promise((resolve, reject) => {
    try {
      _vue.$store.dispatch("bulletFrameUrlModel/delUrl", data).then((resp) => {
        console.log("删除完了", _vue.$store.state.bulletFrameUrlModel.url);
        resolve(data);
      });
    } catch (e) {
      console.log("删除出现异常", e);
      reject();
    }
  });
}

/**
 * 添加遮罩层样式
 * @param {*} params
 * params: {style}
 *
 * Mark.Yuan
 */
export function designShadeMaskStyle(params) {
  try {
    document.getElementById(params.id).style.cssText = params.style;
  } catch (error) {
    throw new Error(`Dom Body-mark not exist; ${error}`);
  }
}

export function moveUrl(data, _vue = this) {
  console.log("dataData3", data);
  if (!data.viewId) {
    data.viewId = _vue.curViewId; // 记录当前页面id
  }
  return new Promise((resolve, reject) => {
    try {
      let aa = null;
      _vue.$store.dispatch("bulletFrameUrlModel/moveUrl", data).then(() => {
        aa = _vue.$store.state.bulletFrameUrlModel.moveInfo;
        console.log("移动完了1", aa, _vue.$store.state.bulletFrameUrlModel.url);
        // 可能是需要移动大屏配置中的url
        _vue.$store.dispatch("iframeUrlModel/moveUrl", data).then(() => {
          aa = aa || _vue.$store.state.iframeUrlModel.moveInfo;
          console.log("移动完了2", aa, _vue.$store.state.iframeUrlModel.url);
          resolve(aa);
        });
      });
    } catch (e) {
      console.log("移动异常", e);
      reject();
    }
  });
}

/**
 * moveIframeUrl 非林业行业用此方法移动
 * @param {*} data
 * @param {*} _vue
 */
export function moveIframeUrl(data, _vue = this) {
  console.log("moveIframeUrl", data);
  if (!data.viewId) {
    data.viewId = _vue.curViewId; // 记录当前页面id
  }
  return new Promise((resolve, reject) => {
    try {
      // 非林业行业用此方法移动
      _vue.$store.dispatch("iframeUrlModel/moveIframeUrl", data).then(() => {
        let aa = _vue.$store.state.iframeUrlModel.moveInfo;
        console.log(
          "非林业行业移动完了",
          aa,
          _vue.$store.state.iframeUrlModel.url
        );
        resolve(aa);
      });
    } catch (e) {
      console.log("移动异常了", e);
      reject();
    }
  });
}

/**
 * Message 消息提示
 * @param {*} data
 * @param {*} _vue
 */
export function message(data, _vue = this) {
  if (!data.type) {
    data.type = "info";
  }
  _vue.$message(data);
}

/**
 * 告警弹出打开事件
 * @param data 告警传入的参数
 * 格式：{
    id: '', // 告警id
    industryCode: '', // 行业编码
    scale: '', // 缩放比例
    left: '', // 定位的left值
    top: '', // 定位的top值
    viewerId: '', // 大屏ID
    targetIframeId: '', // iframe接收ID
    timer: new Date().getTime(), // 随机数
  }
 * @param _vue vue 对象
 *
 * Mark.Yuan
 */
export function openAlertDialog(data, _vue = this) {
  const defaultOptions = {
    id: "", // 告警id
    industryCode: "", // 行业编码
    scale: 1,
    left: 0,
    top: 0,
    viewerId: 0,
    timer: new Date().getTime(),
  };
  const options = Object.assign({}, defaultOptions, data);
  // $AlarmDialog 全局弹窗组件
  _vue.$AlarmDialog(options);
}
export function closeAlertDialog(_vue = this) {
  // $AlarmDialog 全局弹窗组件
  _vue.$closeDialog();
}

/**
 * 打开视频弹窗，video-listener 组件
 * @param {*} data 数据
 * @param {*} _vue Vue实例对象
 *
 * Mark.Yuan 0704
 */
export function openVideoModal(data, _vue = this) {
  try {
    if (isEmptyObject(data)) {
      throw new Error(`params can't empty`);
    }
    if (
      !(
        _vue.$parent.$refs["videoListenerRef"] || _vue.$refs["videoListenerRef"]
      )
    ) {
      throw new Error("Video Listener Component not install");
    }
    if (_vue.$parent?.$refs["videoListenerRef"]) {
      _vue.$parent.$refs["videoListenerRef"].playVideo(data);
    } else {
      if (_vue.$refs["videoListenerRef"]) {
        _vue.$refs["videoListenerRef"].playVideo(data);
      }
    }
  } catch (error) {
    throw new Error(`OpenVideoModal fail, error: ${error}`);
  }
}

/**
 * 在子行业中关闭主行业的视图联动 video-listener 组件
 */
export function closeVideoModal(data = {}, _vue = this) {
  try {
    if (
      !(
        _vue.$parent.$refs["videoListenerRef"] || _vue.$refs["videoListenerRef"]
      )
    ) {
      console.warn("Video Listener Component not install");
      return;
    }
    if (_vue.$parent?.$refs["videoListenerRef"]) {
      _vue.$parent.$refs["videoListenerRef"].videoCloseAll();
    } else {
      if (_vue.$refs["videoListenerRef"]) {
        _vue.$refs["videoListenerRef"].videoCloseAll();
      }
    }
  } catch (error) {
    console.warn(`closeVideoModal fail, error: ${error}`);
  }
}

/**
 * 生成iframe加密验证密钥
 */
export function generateIframeEncryptKeys(_vue = this) {
  const { industryCode } = _vue.$store.getters.userInfo;
  const randomCodeData = cryptoUtil.randomCode(8);
  const currentUrl = `${document.location.origin}/api`;
  const encryptStr = `${industryCode}${new Date().getTime()}${randomCodeData}`;
  const _V = iframeEncrypt(encryptStr);

  // 对允许的urls做一次加密
  const allowUrls = _vue.$store.getters.allowUrls;
  const _tmpAllowUrls = allowUrls.split(",");
  const urls = [];
  _tmpAllowUrls &&
    _tmpAllowUrls.forEach((item) => {
      urls.push(cryptoUtil.md5Enc(item));
    });
  urls.push(currentUrl);
  const _AU = cryptoUtil.aesEncrypt(`${randomCodeData}${urls.join(",")}`);

  return {
    industryCode,
    _V,
    _AU,
  };
}

/**
 * 视频分屏弹出打开事件
 * @param data 视频分屏传入的参数
 * 格式：{
    title: '', // 弹窗标题
    videoList: [], // 视频分屏数据
    number: 0, // 分屏数量
    showQuickTool: true, // 是否开启视频快捷方式功能
    vueIns: this // vue 对象
  }
 * @param _vue vue 对象
 *
 * Yang
 */
export function openVideoDialog(data, _vue = this) {
  const videoOptions = {
    title: "", // 弹窗标题
    videoList: [], // 视频分屏数据
    number: 4, // 分屏数量
    showQuickTool: true, // 是否开启视频快捷方式功能
    vueIns: _vue, // vue 对象
  };
  const options = Object.assign({}, videoOptions, data);
  $CtDialogVideo(options);
}

/**
 * 语音喊话弹出打开事件
 * @param data 语音喊话传入的参数
 * 格式：{
    background: '', // 背景色
    size: '', // 语音喊话按钮大小
    iconSize: '', // 图标大小
    iconColor: '', // 图标颜色
    startTip: '', // 提示文字
    tipCustomStyle: {}, // 文字自定义样式
    tipSecondCustomStyle: {}, // 读秒样式
    titleCustomStyle: {}, // 自定义头部样式
    title: '', // 头部文字
    deviceCode: '', // 相机通道
    volume: '100',
    protocolType: '5',
    networkType: '1',
    callBack: true  // 是否需要回调监听
  }
 * @param _vue vue 对象
 *
 * Yang
 */
export function openAudioRecorder(data, _vue = this) {
  const options = {
    background: "#FF6A6C", // 背景色
    size: 100, // 语音喊话按钮大小
    iconSize: 60, // 图标大小
    iconColor: "#fff", // 图标颜色
    startTip: "", // 提示文字
    tipCustomStyle: {}, // 提示文字自定义样式
    tipSecondCustomStyle: {}, // 读秒样式
    titleCustomStyle: {}, // 自定义头部样式
    title: "", // 头部文字
    deviceCode: "", // 相机通道
    volume: 100,
    protocolType: 5,
    networkType: 1,
    callBack: true,
  };
  const option = Object.assign({}, options, data);
  $CtAudioRecorder(option);
}
//看这里
export function lookhere(data, _vue = this) {
  const defaultOptions = {
    borderColor: "", //高亮边框颜色
    bottomLookY: 0, //y轴底部定位值
    rightLookY: 0, //y轴右侧值
    lookUrlNum: 0, //播放视频路数
    distance: "0", //半径
    lookLongitude: 0, //经度
    lookLatitude: 0, //纬度
    targetIframeId: "", // iframe接收ID
    vueIns: _vue, // vue 对象
  };
  const options = Object.assign({}, defaultOptions, data);
  $CtLookHere(options);
}

/**
 * @param data
 * startSpeaking
 * {
 *    method: 'startSpeaking',
 *    deviceCode: <deviceCode>,
 *    volume: "100", // 音量
 *    networkType: "1", // 网络类型
 *    needBack: true // 是否需要消息回调
 * }
 * stopSpeaking
 * {
 *    method: 'stopSpeaking',
 *    deviceCode: <deviceCode>,
 *    lockId: <喇叭锁id>,
 *    messageId: <messageId>,
 *    needBack: true // 是否需要消息回调
 * }
 * @param _vue
 * @returns {Promise}
 */
export function handleAudioRecorder(data, _vue = this) {
  const { method = "startSpeaking", ...otherOptions } = data;
  console.log(`${method}-param`, data);
  return new Promise((resolve, reject) => {
    try {
      if (method === "stopSpeaking") {
        AudioRecorderApi.stopSpeaking(otherOptions)
          .then((res) => {
            console.log("stopSpeaking-res", res);
            resolve(res);
          })
          .catch((error) => {
            console.error("stopSpeaking-error", error);
            reject(error);
          });
      } else {
        const defaultOptions = {
          volume: 100,
          protocolType: location.protocol === "https:" ? 2 : 5,
          networkType: 1,
        };
        const options = Object.assign({}, defaultOptions, otherOptions);
        AudioRecorderApi.startSpeaking(options, (errTile) => {
          console.log("startSpeaking-errorFn", errTile);
          let paramStop = Object.assign({}, otherOptions, lockId);
          AudioRecorderApi.stopSpeaking(paramStop);
          _vue.$message.error(errTile);
        })
          .then((res) => {
            console.log("startSpeaking-res", res);
            lockId = res?.lockId;
            resolve(res);
          })
          .catch((error) => {
            console.error("startSpeaking-error", error);
            reject(error);
          });
      }
    } catch (e) {
      console.error(`${method}-error-e`, e);
      reject(e);
    }
  });
}

/**
 *
 * @param data {deviceCode: this.detailData.deviceCode,
    volume: "100",
    protocolType: location.protocol === 'https:' ? '2' : '5',
    networkType: "1"}
 * @param _vue
 * @returns {Promise}
 */
export function startSpeaking(data, _vue = this) {
  console.log("startSpeaking-param", data);
  return new Promise((resolve, reject) => {
    try {
      AudioRecorderApi.startSpeaking(data, (errTile) => {
        console.log("startSpeaking-erorrFn", errTile);
        _vue.$message.error(errTile);
      })
        .then((res) => {
          console.log("startSpeaking-res", res);
          resolve(res);
        })
        .catch((error) => {
          console.log("startSpeaking-error", error);
          reject(error);
        });
    } catch (e) {
      console.log("startSpeaking-error-e", e);
      console.log("增加出现异常", e);
      reject(e);
    }
  });
}

/**
 *
 * @param data {deviceCode: this.detailData.deviceCode, lockId: this.lockId, messageId: this.messageId}
 * @param _vue
 * @returns {Promise}
 */
export function stopSpeaking(data, _vue = this) {
  console.log("stopSpeaking-param", data);
  return new Promise((resolve, reject) => {
    try {
      AudioRecorderApi.stopSpeaking(data)
        .then((res) => {
          console.log("stopSpeaking-res", res);
          resolve(res);
        })
        .catch((error) => {
          console.log("stopSpeaking-error", error);
          reject(error);
        });
    } catch (e) {
      console.log("stopSpeaking-error-e", e);
      console.log("增加出现异常", e);
      reject(e);
    }
  });
}

/**
 * 多视频组件
 * @param data 多视频组件传入的参数
 * 格式：{
    bottom: 0, // y轴底部定位值
    right: 0, // y轴右侧值
    targetIframeId: '', // iframe接收ID
    vueIns: '', //  vue 对象
    videoList: '', // 视频数据
    longitude: 0, // 经度
    latitude: 0, // 纬度
    channelCode: '', // 自定义头部样式
    deviceCode: '', // 头部文字
    deviceType: '', // 协议类型
    borderColor: '', // 视频边框高亮颜色
  }
* @param _vue vue 对象
*
* Yang
*/
export function linkVideo(data, _vue = this) {
  const defaultOptions = {
    bottom: 0, //y轴底部定位值
    right: 0, //y轴右侧值
    targetIframeId: "", // iframe接收ID
    vueIns: _vue, // vue 对象
    videoList: [], // 视频数据
    iframeOperationId: "", // (SDK调用时必传)，固定参数名，值对应iframe提供的方法名称
    borderColor: "", // 视频边框高亮颜色
  };
  const options = Object.assign({}, defaultOptions, data);
  _vue.$store.dispatch("linkVideo/linkVideoData", {});
  $CtLinkVideo(options);
}

/**
 * 打开文件预览
 * @param option 参数
 * 格式：{
    title: '',// 提示标题
    fullscreen: true, // 是否全屏
    width: 'auto', // 弹窗宽度，fullscreen = false 起效
    height: 'auto', // 弹窗高度，fullscreen = false 起效，建议使用vh
    url: '', // 预览文件URL地址
    fileName: '', // 文件名称
  }
* @param _vue vue 对象
 */
export function fileViewer(option, _vue = this) {
  const defaultOptions = {
    title: "", // 提示标题
    fullscreen: true, // 是否全屏
    width: "auto", // 弹窗宽度，fullscreen = false 起效
    height: "auto", // 弹窗高度，fullscreen = false 起效，建议使用vh
    url: "", // 预览文件URL地址
    fileName: "", // 文件名称
  };
  const options = Object.assign({}, defaultOptions, option);
  $FileViewer(options);
}
